home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
159_01
/
database.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-05-15
|
6KB
|
379 lines
/* programs in DATABASE.C no changes for V 1.43 */
#include "advent.h"
static VOID NEAR PASCAL DisplayText(char *pTbl[], SHORT sMsg);
/* Routine to fill travel array for a given location. */
VOID PASCAL gettrav(SHORT loc)
{
extern TRAVTAB TravTab[];
--loc;
pTravel = TravTab[loc].pTrav;
sTravCnt = TravTab[loc].sTrav;
return;
}
/* Routine to request a yes or no answer to a question. */
SHORT PASCAL yes(SHORT msg1, SHORT msg2, SHORT msg3)
{
auto char answer[80];
if (msg1)
rspeak(msg1);
putchar('>');
gets(answer);
if (tolower(answer[0]) == 'n')
{
if (msg3)
rspeak(msg3);
return(0);
}
if (msg2)
rspeak(msg2);
return(1);
}
/* Print a random message from database 6 */
VOID PASCAL rspeak(SHORT msg)
{
extern char *pTextMsg[];
if (dbgflg)
printf("** rspeak(%d) ** ", msg);
DisplayText(pTextMsg, msg);
return;
}
/* Routine to print the message for an item in a given state. */
VOID PASCAL pspeak(SHORT item, SHORT state)
{
register char *p;
extern char *pObjDesc[];
if (dbgflg)
printf("** pspeak(%d,%d) ** ", item, state);
p = pObjDesc[item - 1];
while (state > -1)
{
while (*p && '/' != *p)
++p;
if (NUL == *p)
return;
++p;
--state;
}
while (TRUE)
{
if (NUL == *p || '/' == *p)
break;
putchar(*p);
++p;
}
putchar('\n');
return;
}
/* Print the long description of a location */
VOID PASCAL desclg(SHORT loc)
{
extern char *pLongRmDesc[];
if (dbgflg)
printf("** desclg(%d) ** ", loc);
DisplayText(pLongRmDesc, loc);
putchar('\n');
return;
}
/* Print the short description of a location */
VOID PASCAL descsh(SHORT loc)
{
extern char *pShortRmDesc[];
if (dbgflg)
printf("** descsh(%d) ** ", loc);
DisplayText(pShortRmDesc, loc);
putchar('\n');
return;
}
static VOID NEAR PASCAL DisplayText(char *pTbl[], SHORT sMsg)
{
auto char *p;
--sMsg;
if ('@' == *pTbl[sMsg])
{
p = pTbl[sMsg] + 1;
while (*p)
{
DisplayText(pTbl, atoi(p));
while (*p && ',' != *p)
++p;
if (',' == *p)
++p;
}
}
else
puts(pTbl[sMsg]);
return;
}
/* routine to look up a vocabulary word.
word is the word to look up.
val is the minimum acceptable value,
if != 0 return %1000
*/
SHORT PASCAL vocab(char *word, SHORT val)
{
register SHORT i;
register SHORT left, right;
auto SHORT sCmp;
extern SHORT sVocabCount;
extern VOCABTAB VocabTab[];
left = 0;
right = sVocabCount - 1;
while (right >= left)
{
i = (left + right) / 2;
sCmp = *word - *VocabTab[i].pWord;
if (0 == sCmp)
sCmp = strcmp(word, VocabTab[i].pWord);
if (0 == sCmp)
return(val ? VocabTab[i].sWord % 1000 : VocabTab[i].sWord);
if (sCmp < 0)
right = i - 1;
else
left = i + 1;
}
return(-1);
}
/*
Utility Routines
*/
/*
Routine to test for darkness
*/
BOOL PASCAL dark(VOID)
{
return(!(cond[loc] & LIGHT) && (!prop[LAMP] || !here(LAMP)));
}
/*
Routine to tell if an item is present.
*/
BOOL PASCAL here(SHORT item)
{
return (place[item] == loc || toting(item));
}
/*
Routine to tell if an item is being carried.
*/
BOOL PASCAL toting(SHORT item)
{
return(place[item] == -1);
}
/*
Routine to tell if a location causes
a forced move.
*/
BOOL PASCAL forced(SHORT atloc)
{
return(cond[atloc] == 2);
}
/*
Routine true x% of the time.
*/
BOOL PASCAL pct(SHORT x)
{
return(rand() % 100 < x);
}
/*
Routine to tell if player is on
either side of a two sided object.
*/
BOOL PASCAL at(SHORT item)
{
return(place[item] == loc || fixed[item] == loc);
}
/*
Routine to destroy an object
*/
VOID PASCAL dstroy(SHORT obj)
{
move(obj, 0);
return;
}
/*
Routine to move an object
*/
VOID PASCAL move(SHORT obj, SHORT where)
{
auto SHORT from;
from = (obj < MAXOBJ) ? place[obj] : fixed[obj];
if (from > 0 && from <= 300)
carry(obj, from);
drop(obj, where);
return;
}
/*
Juggle an object
currently a no-op
*/
VOID PASCAL juggle(SHORT loc)
{
loc = loc; /* eliminate compiler warning */
return;
}
/*
Routine to carry an object
*/
VOID PASCAL carry(SHORT obj, SHORT where)
{
where = where; /* eliminate compiler warning */
if (obj < MAXOBJ)
{
if (place[obj] == -1)
return;
place[obj] = -1;
++holding;
}
return;
}
/*
Routine to drop an object
*/
VOID PASCAL drop(SHORT obj, SHORT where)
{
if (obj < MAXOBJ)
{
if (place[obj] == -1)
--holding;
place[obj] = where;
}
else
fixed[obj - MAXOBJ] = where;
return;
}
/*
routine to move an object and return a
value used to set the negated prop values
for the repository.
*/
SHORT PASCAL put(SHORT obj, SHORT where, SHORT pval)
{
move(obj, where);
return((-1) - pval);
}
/*
Routine to check for presence
of dwarves..
*/
SHORT PASCAL dcheck(VOID)
{
register SHORT i;
for (i = 1; i < (DWARFMAX - 1); ++i)
{
if (dloc[i] == loc)
return(i);
}
return(0);
}
/*
Determine liquid in the bottle
*/
SHORT PASCAL liq(VOID)
{
auto SHORT i, j;
i = prop[BOTTLE];
j = (-1) - i;
return(liq2(i > j ? i : j));
}
/*
Determine liquid at a location
*/
SHORT PASCAL liqloc(SHORT loc)
{
if (cond[loc] & LIQUID)
return(liq2(cond[loc] & WATOIL));
return(liq2(1));
}
/*
Convert 0 to WATER
1 to nothing
2 to OIL
*/
SHORT PASCAL liq2(SHORT pbottle)
{
return((1 - pbottle) * WATER + (pbottle >> 1) * (WATER + OIL));
}
/*
Fatal error routine
*/
VOID PASCAL bug(SHORT n)
{
printf("Fatal error number %d\n", n);
exit(1);
}